home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
misc
/
emu
/
QDOS2.lha
/
QLsource
/
ROMsrc
/
SYS
/
QDOS2_asm
< prev
next >
Wrap
Text File
|
1995-06-26
|
16KB
|
771 lines
*/beginfile QDOS2_asm
; --------------------------------------------------------------
; QDOS2_asm - The QDOS kernel
; - last modified 24/06/95
; QDOS-Amiga sources by Rainer Kowallik
; ...latest changes by Mark J Swift
; --------------------------------------------------------------
; --------------------------------------------------------------
; was serial input/output routines
L00AC0:
; --------------------------------------------------------------
;*/beginoverlay
;*/beginfilling
NOP00C88:
DCB.w ($C88-(NOP00C88-ORG0))/2,$4E71
L00C88:
;*/endfilling
*/endoverlay
; --------------------------------------------------------------
; PIPE Device driver
; --------------------------------------------------------------
DRLST:
DC.L L00D36-ORG0
DC.L IO_SERQ-ORG0 ; I/O Routine
DC.L PIPE_OPEn-ORG0 ; OPEN
DC.L PIPE_CLOse-ORG0 ; CLOSE
L00C98:
PIPE_OPEn:
SUBQ.W #2,A7 ;*/undomend SUBQ.L #2,A7
MOVEA.L A7,A3
JSR IO_NAME(PC) ;*/undomodify BSR IO_NAME
BRA.S L00D00 ; error
BRA.S L00D00 ; error
BRA.S L00CB2 ; success
DC.W 4
DC.B 'PIPE'
DC.W 1,$205F ; 1 parameter, " _"
; necessary
DC.W 0 ; length parameter
L00CB2:
MOVE.W (A7),D1
BEQ.S L00CD2
ADDI.W #$31,D1
JSR MM_ALCHP(PC) ;*/undomodify BSR MM_ALCHP
BNE.S L00D00
MOVE.W (A7),D1 ;!!! word length may cause
; errors !!!
ADDQ.W #1,D1
LEA $20(A0),A2 ; pointer to buffer
JSR IO_QSET(PC) ;*/undomodify BSR IO_QSET
MOVE.L A2,$1C(A0)
BRA.S L00CFE
L00CD2:
;*/undoinsert SUB.L A2,A2
MOVEA.W D3,A2 ;*/note d3 sign exten long
ADDA.L A2,A2
ADDA.L A2,A2
ADDA.L $78(A6),A2 ; pointer to base of channel
; table
MOVEA.L (A2),A2
; is it a pipe channel ?
CMPI.L #(DRLST-ORG0),4(A2) ;*/undomodify EXG D0,A0;
;LEA DRLST(PC),A0; EXG A0,D0
;CMP.L 4(A2),D0
BNE.S L00D04 ; no -> continue searching
MOVE.L A2,-(A7)
MOVEQ #$20,D1
JSR MM_ALCHP(PC) ;*/undomodify BSR MM_ALCHP
MOVEA.L (A7)+,A2
BNE.S L00D00
LEA $20(A2),A2 ; pointer to buffer
MOVE.L A0,(A2)
MOVE.L A2,$18(A0)
L00CFE:
MOVEQ #0,D0
L00D00:
ADDQ.W #2,A7 ;*/undomend ADDQ.L #2,A7
RTS
L00D04:
MOVEQ #-15,D0
ADDQ.W #2,A7 ;*/undomend ADDQ.L #2,A7
RTS
L00D0A:
PIPE_CLOse:
TST.L $18(A0) ; is channel open ?
BNE.S L00D1C
LEA $20(A0),A2 ; pointer to buffer
TST.L (A2) ; file empty ?
;if so - close channel
beq.s L00D32 ;*/undomodify BEQ MM_RECHP
;*/note would be quicker though
; --------------------------------------------------------------
;*/beginoverlay
JMP IO_QEOF(PC) ;*/undomodify BRA IO_QEOF
;*/note routine has moved
;*/endoverlay
; --------------------------------------------------------------
L00D1C:
MOVE.L $18(A0),-(A7)
;close channel
bsr.s L00D32 ;*/undomodify BSR MM_RECHP
;*/note would be quicker though
MOVEA.L (A7)+,A2
LEA -$20(A2),A0
TST.B (A2) ; file empty ?
;if so - close channel
blt.s L00D32 ;*/undomodify BLT MM_RECHP
;*/note would be quicker though
CLR.L (A2)
MOVEQ #0,D0
RTS
;*/beginrestorecode
L00D32:
JMP MM_RECHP(PC) ;*/undomodify bra MM_RECHP
;*/endrestorecode
; *******************************************************
; * CONsole and SCReen device driver *
; *******************************************************
; --------------------------------------------------------------
;*/beginoverlay
L00D36:
DC.L 0 ;*/modify DC.L L01104-ORG0
;*/note now last in list
;*/endoverlay
; --------------------------------------------------------------
DC.L CON_IN_Out-ORG0 ; I/O routine
DC.L CON_OPEN-ORG0 ; OPEN
DC.L CON_CLOSe-ORG0 ; CLOSE
L00D46:
CON_OPEN:
SUBA.W #$A,A7 ;*/undomend SUBA.L
;*/note #$A sign extended long
MOVEA.L A7,A3
JSR IO_NAME(PC) ;*/undomodify BSR IO_NAME
BRA.S L00D9E ; error , try SCR
BRA.S L00DC8 ; error
BRA.S L00D72 ; success
DC.W 3
DC.B 'CON',0
DC.W 5,' _' ; 5 parameters, needs " _"
DC.W $1C0,' X' ; width needs " X"
DC.W $B4,' A' ; hight needs " A"
DC.W $20,' X' ; x-origin needs " X"
DC.W $10,' _' ; y-origin needs " _"
DC.W $80 ; defaut buffer: 128 bytes
L00D72:
MOVEQ #$7A,D1 ; initialize
ADD.W 8(A7),D1
BSR.S L00DCE ; open
BNE.S L00DC8 ; out of memory
LEA $68(A0),A2 ; initialize keyboard buffer
SUBI.W #$78,D1
JSR IO_QSET(PC) ;*/undomodify BSR IO_QSET
MOVEA.L $4C(A6),A3 ; pointer to keyboard queue
MOVE.L A3,D3
BNE.S L00D98 ; if buffer exists: create
; new one
MOVE.L A2,(A2)
MOVE.L A2,$4C(A6) ; Pointer to keyboard queue
BRA.S L00DC6
L00D98:
MOVE.L (A3),(A2) ; link buffer-address
MOVE.L A2,(A3)
BRA.S L00DC6 ; back without error
L00D9E:
JSR IO_NAME(PC) ;*/undomodify BSR IO_NAME
BRA.S L00DC8 ; error
BRA.S L00DC8 ; error
BRA.S L00DC0 ; success
DC.W 3
DC.B 'SCR',0
DC.W 4,' _',$01C0,' X',$00B4,' A',$0020,' X',$0010
L00DC0:
MOVEQ #$6C,D1 ; length of description
BSR.S L00DCE ; open channel
BRA.S L00DC8
L00DC6:
MOVEQ #0,D0
L00DC8:
ADDA.W #$0A,A7 ;*/undomend ADDA.L
;*/note #$0A sign extended long
RTS
L00DCE:
JSR MM_ALCHP(PC) ;*/undomodify BSR MM_ALCHP
BNE.S L00E38
MOVE.W D1,-(A7)
LEA $26(A0),A2
MOVE.L #$06000A,(A2)+ ; character size / cursor
; increment
MOVE.L #(FONT1-ORG0),(A2)+ ; Character fount 0-127
MOVE.L #(FONT2-ORG0),(A2)+ ; Character fount 128-256
bsr CONFIX ;*/modify MOVE.L #$20000,(A2)+
nop ;*/modify
MOVE.W #$80,$64(A0) ; length of buffer ?
LEA $3E(A0),A1
MOVEQ #4,D1
MOVE.B D1,$46(A0) ; ink colour
JSR L027D8(PC) ;*/undomodify BSR L027D8
MOVE.L #$08076400,$56(A0) ; 100.0 = graphics scale
; factor
bsr.l MDTSTFIX ;*/modify BTST #3,$34(A6)
nop ;*/modify
BEQ.S L00E20
ADDQ.W #6,$26(A0) ; SD.XINC cursor increment
BSET #6,$42(A0) ; character attributes =
; double width
L00E20:
MOVEQ #0,D2
LEA 6(A7),A1
JSR SD_WDEF(PC) ;*/undomodify BSR SD_WDEF
MOVE.W (A7)+,D1
TST.L D0 ; error ?
BEQ.S L00E38
MOVE.L D0,-(A7)
JSR MM_RECHP(PC) ;*/undomodify BSR MM_RECHP
MOVE.L (A7)+,D0 ; report
L00E38:
RTS
; Console close
L00E3A:
CON_CLOSe:
LEA $68(A0),A3 ; Input queue
TST.L (A3)
BEQ.S L00E70
MOVEA.L (A3),A2
CMPA.L A2,A3
BNE.S L00E4E
CLR.L $4C(A6) ;SV.KEYQ Pointer to a
; keyboard queue
BRA.S L00E70
L00E4E:
CMPA.L $4C(A6),A3 ;SV.KEYQ Pointer to a
; keyboard queue
BNE.S L00E66
L00E54:
TST.B -$25(A2)
BNE.S L00E62
CMPA.L (A2),A3
BEQ.S L00E62
MOVEA.L (A2),A2
BRA.S L00E54
L00E62:
MOVE.L A2,$4C(A6) ;SV.KEYQ Pointer to a
; keyboard queue
L00E66:
MOVEA.L A3,A2
L00E68:
MOVEA.L (A2),A2
CMPA.L (A2),A3
BNE.S L00E68
MOVE.L (A3),(A2)
L00E70:
JSR MM_RECHP(PC) ;*/undomodify BRA MM_RECHP
RTS ;*/undomodify nop
; CONsole I/O
L00E76:
CON_IN_Out:
TST.B $33(A6) ; screen status (freeze ?)
BEQ.S L00E80 ; call TRAP3_UP
MOVEQ #-1,D0 ; not complete
RTS
; This is called by the CON_ and SCR_ device driver
L00E80:
CMPI.B #7,D0
BHI.S L00EFC ;*/undomodify BHI TRAP3_UP
;*/note would be quicker though
MOVEQ #-1,D7
MOVEQ #0,D6
MOVE.W D2,D5
MOVE.L D1,D4
MOVEA.L A1,A4
LEA $68(A0),A5
TST.L D3
BLT.S L00EB0
CMPI.B #$04,D0
BHI.S L00EB0
TST.L (A5)
BEQ.S L00EEC
MOVEA.L $4C(A6),A2 ; pointer to keyboard queue
TST.B -$25(A2)
BNE.S L00EB0
MOVE.L A5,$4C(A6) ; pointer to keyboard queue
L00EB0:
MOVE.B L00EB8(PC,D0.W),D0
JMP L00EB8(PC,D0.W)
L00EB8:
DC.B L00EC0-L00EB8 ; test pending input
DC.B L00EC4-L00EB8 ; put byte
DC.B L00F54-L00EB8
DC.B L00ECA-L00EB8 ; edit line
DC.B L00F5A-L00EB8
DC.B L00F00-L00EB8
DC.B L00EEC-L00EB8 ; not used
DC.B L00EDE-L00EB8 ; put in queue
; ----------------------------------------------------
; General scr I/O
; ----------------------------------------------------
L00EC0:
JMP IO_QTEST(PC) ;*/undomodify BRA IO_QTEST
L00EC4:
MOVEA.L A5,A2 ; A2=buffer address of
; keyboard
JMP IO_QOUT(PC) ;*/undomodify BRA IO_QOUT
L00ECA:
MOVEQ #0,D0
L00ECC:
CMP.W D4,D5 ; all chars printed
BLS.S L00EEE
MOVEA.L A5,A2
JSR IO_QOUT(PC) ;*/undomodify BSR IO_QOUT
BLT.S L00EEE
MOVE.B D1,(A4)+
ADDQ.W #1,D4
BRA.S L00ECC
L00EDE:
MOVEQ #0,D0
CMP.W D4,D5
BLS.S L00EEE
MOVE.B (A4)+,D1
BSR.S L00F00
ADDQ.W #1,D4
BRA.S L00EDE
L00EEC:
MOVEQ #-$0F,D0
L00EEE:
MOVE.W D4,D1
MOVEA.L A4,A1
BCLR #$07,$42(A0)
RTS
L00EFA:
MOVEQ #5,D0 ; IO.SBYTE
L00EFC:
JMP TRAP3_UP(PC) ;*/undomodify BRA TRAP3_UP
L00F00:
MOVEQ #0,D0
CMPI.B #$0A,D1 ; Line Feed ?
BEQ.S L00F36 ; add new line
TST.B $48(A0) ; new line status
BEQ.S L00F14 ; position cursor
MOVE.B D1,-(A7) ; byte to send on stack
BSR.S L00F46 ; position cursor
MOVE.B (A7)+,D1 ; ?????? REALLY ?
L00F14:
BSR.S L00EFA ; put byte
BEQ.S L00F44 ; succeeded -> end
MOVE.W $26(A0),D0 ; if not: increment cursor
ADD.W D0,$22(A0)
BTST #$07,$42(A0)
BNE.S L00F42
MOVE.B D0,$48(A0)
TST.B $43(A0) ; cursor off ?
BEQ.S L00F42 ; end
BSR.S L00F46 ; position cursor
BRA.S L00F42
L00F36:
TST.B $48(A0) ; is cursor at end of line ?
BGE.S L00F3E
BSR.S L00F46 ; position cursor
L00F3E:
ST $48(A0)
L00F42:
MOVEQ #0,D0
L00F44:
RTS
; position cursor
L00F46:
TST.B $43(A0) ; new line - cursor activ ?
BLE.S L00F50 ; no
JSR GET_CURPos(PC) ;*/undomodify BSR GET_CURPos
; test position
L00F50:
JMP L01BF8(PC) ;*/undomodify BRA L01BF8
; if necessary: LF
L00F54:
TST.L D3
BEQ.S L00F6C
BRA.S L00F5E
; line editor
L00F5A:
MOVEQ #-1,D4
MOVE.W D1,D4
L00F5E:
SWAP D1
MOVE.W D1,D6 ; position of cursor
SUBA.W D4,A4 ; position cursor in buffer
ADDA.W D6,A4
BNE.S L00F84 ; end of buffer
TST.L D3
BLT.S L00F84
L00F6C:
TST.B $43(A0) ; cursor on ?
BLE.S L00F76
JSR GET_CURPos(PC) ;*/undomodify BSR GET_CURPos
; position cursor
L00F76:
JSR L01BF2(PC) ;*/undomodify BSR L01BF2
; if neccessary to start
BSR L010DC ; of next line
MOVE.W D4,D6
SUB.W D3,D6
SUBA.W D3,A4 ;!!! word length may cause
; errors !!!
L00F84:
MOVE.B $43(A0),-(A7)
L00F88:
MOVEA.L A5,A2 ; keyboard buffer
JSR IO_QOUT(PC) ;*/undomodify BSR IO_QOUT
; get byte
BLT L01018 ; EOF ?
TST.B $43(A0) ; cursor activ
BLE.S L00FA0
MOVE.B D1,-(A7) ; received byte
JSR GET_CURPos(PC) ;*/undomodify BSR GET_CURPos
; position cursor
MOVE.B (A7)+,D1 ; ????
L00FA0:
CMPI.B #$0A,D1 ; Line Feed ?
BEQ.S L01002
CMPI.B #$1F,D1 ; not a valid character ->
; do nothing
BLS.S L00F88
CMPI.B #$BF,D1 ; >191 -> append chequer
; board
BHI.S L00FDA
MOVE.W D4,D0 ; length of line
SUB.W D6,D0 ; actual position
BRA.S L00FBE ; store byte
L00FB8:
MOVE.B 0(A4,D0.W),1(A4,D0.W) ; line out
L00FBE:
DBF D0,L00FB8
ADDQ.W #1,D6
ADDQ.W #1,D4 ; correct pointer
MOVE.B D1,(A4)+ ; store byte
MOVEQ #-1,D7
BSR L010AC
BSR L010CE ; scroll ?
CMP.W D4,D5
BHI.S L00F88 ; more bytes editable
MOVEQ #-5,D0 ; buffer full error
BRA.S L01022
L00FDA:
TST.L D4
BGE.S L00FEA
CMPI.B #$D0,D1 ; cursor up
BEQ.S L01002
CMPI.B #$D8,D1 ; down
BEQ.S L01002
L00FEA:
SUBI.B #$C0,D1 ; left
BEQ.S L01030
SUBQ.B #2,D1 ; ctrl. left = delete
BEQ L0107C
SUBQ.B #6,D1 ; right
BEQ.S L01038
SUBQ.B #2,D1 ; ctrl. right
BEQ L01080
L01000:
BRA.S L00F88 ; position cursor
L01002:
MOVE.B D1,-(A7) ; output of line - cursor
; up/down
MOVEQ #-1,D7
BSR L010E0
MOVE.B (A7)+,(A4)+
ADDQ.W #1,D4
JSR SD_CURS(PC) ;*/undomodify BSR SD_CURS
BSR L00F36
BRA.S L0102A
L01018:
TST.B (A7) ; end of edit
BLT.S L01022
JSR SD_CURE(PC) ;*/undomodify BSR SD_CURE
MOVEQ #-1,D0
L01022:
SUBA.W D6,A4 ;!!! word length may cause
; errors !!!
ADDA.W D4,A4
MOVE.W D6,D1
SWAP D1
L0102A:
ADDQ.W #2,A7 ;*/undomend ADDQ.L #2,A7
BRA L00EEE
L01030:
BSR.S L01054 ; cursor left previous line
; ?
BEQ.S L01000 ; pos cursor
L01034:
ADDQ.W #1,D6
BRA.S L01000
L01038:
ADDQ.W #1,D6 ; cursor right
CMP.W D4,D6
BHI.S L01050 ; end of buffer ?
ADDQ.W #1,A4 ;*/undomend ADDQ.L #1,A4
JSR SD_NCOL(PC) ;*/undomodify BSR SD_NCOL
BEQ.S L01000
JSR L01BF8(PC) ;*/undomodify BSR L01BF8
BSR L010CE
BRA.S L01000
L01050:
SUBQ.W #1,D6
L01052:
BRA.S L01000
L01054:
SUBQ.W #1,D6 ; previous line to edit
BLT.S L0107A
JSR SD_PCOL(PC) ;*/undomodify BSR SD_PCOL
BEQ.S L01078
JSR SD_PROW(PC) ;*/undomodify BSR SD_PROW
BNE.S L010DA
MOVE.W $1C(A0),D0
DIVU $26(A0),D0
SUBQ.W #1,D0
MULU $26(A0),D0
MOVE.W D0,$22(A0)
MOVEQ #0,D0
L01078:
SUBQ.W #1,A4 ;*/undomend SUBQ.L #1,A4
L0107A:
BRA.S L010DA
L0107C:
BSR.S L01054 ; delete one character:
; ctrl. left/right
BNE.S L01034
L01080:
CMP.W D6,D4
BEQ.S L01052
SUBQ.W #1,D4
MOVE.W D4,D0
SUB.W D6,D0
MOVE.W D0,D1
BRA.S L01092
L0108E:
MOVE.B $01(A4),(A4)+
L01092:
DBF D0,L0108E
SUBA.W D1,A4 ;!!! word length may cause
; errors !!!
MOVE.L $22(A0),-(A7)
MOVEQ #0,D7
BSR.S L010E0
BNE.S L010A6
MOVEQ #$20,D1
BSR.S L010AC
L010A6:
MOVE.L (A7)+,D7
BSR.S L010D0
BRA.S L01052
L010AC:
BSR L00EFA ; position cursor
BEQ.S L010DA
JSR SD_NL(PC) ;*/undomodify BSR SD_NL
BEQ.S L010DA
TST.W D7
BLT.S L010C8
SUB.W $28(A0),D7
BGE.S L010C8
ADD.W $28(A0),D7
BRA.S L01100
L010C8:
JSR L01BF8(PC) ;*/undomodify BSR L01BF8
; scroll if needed
BRA.S L010D8
L010CE:
BSR.S L010DC
L010D0:
SUBA.W D4,A4 ;!!! word length may cause
; errors !!!
ADDA.W D6,A4
MOVE.L D7,$22(A0)
L010D8:
MOVEQ #0,D0
L010DA:
RTS
L010DC:
MOVE.L $22(A0),D7
L010E0:
MOVEQ #0,D0
MOVE.W D4,D3
SUB.W D6,D3
BRA.S L010F4
L010E8:
MOVE.B (A4)+,D1
MOVE.W D3,-(A7)
BSR.S L010AC
MOVE.W (A7)+,D3
TST.L D0
BNE.S L010FC
L010F4:
DBF D3,L010E8
MOVEQ #0,D3
RTS
L010FC:
ADDA.W D3,A4 ;!!! word length may cause
; errors !!!
ADDQ.W #1,D3
L01100:
TST.L D0
RTS
; end of line editor
; --------------------------------------------------------------
;*/beginoverlay
; was network input/output routines
L01104:
CONFIX:
move.l #$20000,(a2)+ ; Base of screen
move.l SV_JBPNT(a6),a1
move.l (a1),a1
btst #0,JB_RELA6(a1)
beq.s CONFIX1
cmp.l #$30000,a6 ; if sys vars too low
blt.s CONFIX1 ; then no 2nd screen.
bset #7,-2(a2) ; second screen
CONFIX1:
rts
MODEFIX:
moveq #0,d0
MOVE.B SV_MCSTA(A6),D0 ; Current value of MC status
; register
lsl.w #1,d0 ; position correctly
lsl.b #3,d0
lsr.w #1,d0
asr.b #3,d0
andi.b #%10011111,d0 ; keep relevant bits
move.l SV_JBPNT(a6),a4 ; current job
move.l (a4),a4 ; JCB of job
btst #0,JB_RELA6(a4) ; test dflt scrn bit of JOBs' JB_RELA6
beq.s MODEFIX1
eori.b #%10100000,d0
MODEFIX1:
tst.b d0
bpl.s MODEFIX2
bsr MODEFIX4
MODEFIX2:
bclr #7,d0
cmp.l #$30000,a6
blt.s MODEFIX3
ori.b #%10000000,d0
MODEFIX3:
rts
MODEFIX4:
swap d1
lsl.w #4,d0
move.b d0,d1
andi.b #%10100000,d1
lsr.b #2,d1
andi.b #%01010000,d0
or.b d1,d0
lsl.b #1,d0
lsr.w #4,d0
swap d1
rts
CJOBFIX:
LEA (JB_END-JB_PC)(A0),A0 ; start of program area
move.l SV_JBPNT(a6),a4 ; current job
move.l (a4),a4 ; JCB of job
move.b JB_RELA6(a4),d0 ; get screen (lsb of JB_RELA6)
andi.b #%00000001,d0
move.b d0,(JB_RELA6-JB_END)(a0) ; inherit screen
rts
MDTSTFIX:
cmpi.l #$28000,SD_SCRB(a0)
bne.s MDTSTFIX1
btst #7,$34(a6) ; is screen being shown?
beq.s MDTSTFIX2 ; no, check other mode
bra.s MDTSTFIX3 ; yup, check shown mode
MDTSTFIX1:
btst #7,$34(a6) ; is screen being shown?
beq.s MDTSTFIX3 ; yup, check shown mode
MDTSTFIX2:
btst #2,$34(a6) ; 512 or 256 pixel mode ?
rts
MDTSTFIX3:
btst #3,$34(a6) ; 512 or 256 pixel mode ?
rts
MDCLS:
; Clear scrn0 ?
MDCLS0:
btst.w #15,d1
bne.s MDCLS1
lea $28000,a4
move.w #$1FFF,d0
MDCLSLUP0:
clr.l -(a4)
DBF D0,MDCLSLUP0
; Clear scrn1 ?
MDCLS1:
btst.w #14,d1
bne.s MDCLSX
lea $30000,a4
move.w #$1FFF,d0
cmp.l a4,a6
blt.s MDCLSX
MDCLSLUP1:
clr.l -(a4)
DBF D0,MDCLSLUP1
MDCLSX:
rts
;*/beginfilling
NOP01202:
DCB.w ($1202-(NOP01202-ORG0))/2,$4E71
L01202:
;*/endfilling
;*/endoverlay
; --------------------------------------------------------------
; scheduler loop tasks (Cursor)
; --------------------------------------------------------------
SHLST:
; --------------------------------------------------------------
;*/beginoverlay
DC.L SHLST2-ORG0 ;*/modify DC.L SHLST1-ORG0
;*/endoverlay
; --------------------------------------------------------------
DC.L CURSOR_Task-ORG0
CURSOR_Task:
MOVE.L $4C(A6),D4 ; Pointer to a keyboard
; queue
BEQ.S L0122E
MOVEA.L D4,A0
LEA -$68(A0),A0
MOVE.W $AA(A6),D4 ; flashing cursor status
TST.B $43(A0)
BEQ.S L01228
SUB.W D3,D4
BGT.S L0122A
JSR GET_CURPos(PC) ;*/undomodify BSR GET_CURPos
L01228:
MOVEQ #$0C,D4
L0122A:
MOVE.W D4,$AA(A6) ; flashing cursor status
L0122E:
RTS
; --------------------------------------------------------------
;*/endfile